//  专门用来处理导航守卫
// 导入路由对象
import router from "./router";
// 导入 vuex 中的store对象
import store from "@/store";
// 导入 message
import { Message } from "element-ui";
// 导入进度条
import Nprogress from "nprogress";
import "nprogress/nprogress.css";
// 白名单
const writeList = ["/login", "/404"];

// 添加导航守卫
// 前置守卫
router.beforeEach(async (to, from, next) => {
  // 开启进度条
  Nprogress.start();
  const token = store.getters.token;
  // 判断是否存在token
  if (token) {
    // 存在token
    // 判断用户信息是否存在
    const userInfo = store.getters.userInfo;
    if (!userInfo.username) {
      // 说明用户信息不存在，就调用user-actions里的方法去发请求拿
      let res = await store.dispatch("user/getUserInfo"); //异步请求,用await变成同步，解决页面加载完毕，用户信息还没显示
      // 筛选路由信息： 得到当前用户所有的访问权限（得s到所有的动态）
      let newRoutes = await store.dispatch(
        "permission/setRoutes",
        res.roles.menus
      );
      // 将动态路由添加到路由中
      router.addRoutes([
        ...newRoutes,
        { path: "*", redirect: "/404", hidden: true }  // 这里添加404页面
      ]);
      //.addRoutes()添加路由规则后 不能直接使用next()方法 :不能用next()跳到你刚刚添加的路由，因为它还需要时间挂载，直接next()会出现你跳转的路由还未被挂载，
      //  解决方法：需要next(to.path) 自己跳自己一下 注意next(to.path)需要配合.addRutes()使用，直接使用会进入死循环
      if (to.path == "/login") {
        Message({
          type: "info",
          message: "检测到您已经登录"
        });
        // 登录了访问 login 跳转到主页
        next("/");
      } else {
        next(to.path);
      }
    } else {
      // 判断访问的页面是否是 login
      if (to.path == "/login") {
        Message({
          type: "info",
          message: "检测到您已经登录"
        });
        // 登录了访问 login 跳转到主页
        next("/");
      } else {
        // 直接放行
        next();
      }
    }
  } else {
    // token 不存在
    // 判断访问的页面是否在白名单
    if (writeList.indexOf(to.path) > -1) {
      // 在白名单中
      next();
    } else {
      Message({
        type: "warning",
        message: "对不起，您还没有登录"
      });
      // 不在白名单中，跳转到登录页面  保存要访问路径的路由 to.path
      next(`/login?_redirect=${to.path}`);
    }
  }
  // 关闭进度条
  Nprogress.done();
});

// 后置钩子：路由加载完毕后执行
router.afterEach((to, from) => {
  // to: 去的路由
  // from ：来的路由
  // 关闭进度条
  Nprogress.done();
});
